<!DOCTYPE html>
<html>
<!-- Created by GNU Texinfo 7.1.1, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- Copyright © 1988-2023 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the section entitled
"GNU Free Documentation License".

(a) The FSF's Front-Cover Text is:

A GNU Manual

(b) The FSF's Back-Cover Text is:

You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development. -->
<title>Define Subst (GNU Compiler Collection (GCC) Internals)</title>

<meta name="description" content="Define Subst (GNU Compiler Collection (GCC) Internals)">
<meta name="keywords" content="Define Subst (GNU Compiler Collection (GCC) Internals)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta name="viewport" content="width=device-width,initial-scale=1">

<link href="index.html" rel="start" title="Top">
<link href="Option-Index.html" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Machine-Desc.html" rel="up" title="Machine Desc">
<link href="Constant-Definitions.html" rel="next" title="Constant Definitions">
<link href="Conditional-Execution.html" rel="prev" title="Conditional Execution">
<style type="text/css">
<!--
a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
div.example {margin-left: 3.2em}
span:hover a.copiable-link {visibility: visible}
-->
</style>


</head>

<body lang="en">
<div class="section-level-extent" id="Define-Subst">
<div class="nav-panel">
<p>
Next: <a href="Constant-Definitions.html" accesskey="n" rel="next">Constant Definitions</a>, Previous: <a href="Conditional-Execution.html" accesskey="p" rel="prev">Conditional Execution</a>, Up: <a href="Machine-Desc.html" accesskey="u" rel="up">Machine Descriptions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<h3 class="section" id="RTL-Templates-Transformations"><span>17.21 RTL Templates Transformations<a class="copiable-link" href="#RTL-Templates-Transformations"> &para;</a></span></h3>
<a class="index-entry-id" id="index-define_005fsubst"></a>

<p>For some hardware architectures there are common cases when the RTL
templates for the instructions can be derived from the other RTL
templates using simple transformations.  E.g., <samp class="file">i386.md</samp> contains
an RTL template for the ordinary <code class="code">sub</code> instruction&mdash;
<code class="code">*subsi_1</code>, and for the <code class="code">sub</code> instruction with subsequent
zero-extension&mdash;<code class="code">*subsi_1_zext</code>.  Such cases can be easily
implemented by a single meta-template capable of generating a modified
case based on the initial one:
</p>
<a class="index-entry-id" id="index-define_005fsubst-4"></a>
<div class="example smallexample">
<pre class="example-preformatted">(define_subst &quot;<var class="var">name</var>&quot;
  [<var class="var">input-template</var>]
  &quot;<var class="var">condition</var>&quot;
  [<var class="var">output-template</var>])
</pre></div>
<p><var class="var">input-template</var> is a pattern describing the source RTL template,
which will be transformed.
</p>
<p><var class="var">condition</var> is a C expression that is conjunct with the condition
from the input-template to generate a condition to be used in the
output-template.
</p>
<p><var class="var">output-template</var> is a pattern that will be used in the resulting
template.
</p>
<p><code class="code">define_subst</code> mechanism is tightly coupled with the notion of the
subst attribute (see <a class="pxref" href="Subst-Iterators.html">Subst Iterators</a>).  The use of
<code class="code">define_subst</code> is triggered by a reference to a subst attribute in
the transforming RTL template.  This reference initiates duplication of
the source RTL template and substitution of the attributes with their
values.  The source RTL template is left unchanged, while the copy is
transformed by <code class="code">define_subst</code>.  This transformation can fail in the
case when the source RTL template is not matched against the
input-template of the <code class="code">define_subst</code>.  In such case the copy is
deleted.
</p>
<p><code class="code">define_subst</code> can be used only in <code class="code">define_insn</code> and
<code class="code">define_expand</code>, it cannot be used in other expressions (e.g. in
<code class="code">define_insn_and_split</code>).
</p>

<ul class="mini-toc">
<li><a href="Define-Subst-Example.html" accesskey="1"><code class="code">define_subst</code> Example</a></li>
<li><a href="Define-Subst-Pattern-Matching.html" accesskey="2">Pattern Matching in <code class="code">define_subst</code></a></li>
<li><a href="Define-Subst-Output-Template.html" accesskey="3">Generation of output template in <code class="code">define_subst</code></a></li>
</ul>
</div>
<hr>
<div class="nav-panel">
<p>
Next: <a href="Constant-Definitions.html">Constant Definitions</a>, Previous: <a href="Conditional-Execution.html">Conditional Execution</a>, Up: <a href="Machine-Desc.html">Machine Descriptions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>
